সি মেমোরি ম্যানেজমেন্ট (C memory management)

Computer Programming - সি প্রোগ্রামিং (C Programming) সি পয়েন্টার (C Pointer) |
338
338

এই অধ্যায়ে আপনি স্টান্ডার্ড লাইব্রেরী ফাংশন malloc(), calloc(), free() এবং realloc() ব্যবহার করে আপনার প্রোগ্রামে ডাইনামিকভাবে মেমোরি বরাদ্দ(dynamically allocate memory) করা শিখবেন।


সি প্রোগ্রামিং এ, কম্পাইল টাইমে না যাওয়া পর্যন্ত array এর সাইজ অজানা থাকে। অর্থাৎ ঐ সময় পর্যন্ত যতক্ষণ না কম্পাইলার আপনার কোডকে কম্পিউটার বুঝে এমন কোডে এ(language ) রূপান্তর করে। সুতরাং মাঝে মাঝে array এর সাইজ(size) কম অথবা প্রয়োজনের তুলনায় বেশিও হতে পারে।

ডাইনামিক মেমোরি এ লোকেশন(Dynamic memory allocation) আপনার প্রোগ্রাম রান(run) করার সময় হয় অধিক মেমোরি ধরে রাখে অথবা প্রয়োজন না হলে ছেড়ে দেয়।

সহজ অর্থে, ডাইনামিক মেমোরি এলোকেশন আপনার প্রোগ্রামের মেমোরি স্পেস মায়লুয়ালি(manually) পরিচালনা করার সম্মতি দেয়।

সি প্রোগ্রামে উত্তরাধিকার সূত্রে মেমোরি বরাদ্দের জন্য ডাইনামিক কোনো কৌশল না থাকলেও হেডার ফাইল "stdlib.h" এর অধীনে ডাইনামিকভাবে মেমোরি এলোকেশন এর জন্য ৪টি লাইব্রেরী ফাংশন রয়েছে।

ফাংশনফাংশনের ব্যবহার
malloc()অনুরোধের ভিত্তিতে মেমোরি স্পেস বরাদ্দ করে এবং বরাদ্দ করা মেমোরির প্রথম বাইটের জন্য পয়েন্টার রিটার্ন করে।
calloc()Array এর এলিমেন্টের জন্য মেমোরি স্পেস বরাদ্দ করে এবং এর প্রাথমিক ভ্যালু 0(শূন্য) থাকে। তারপরে মেমোরিতে পয়েন্টার রিটার্ন করে।
free()পূর্বের বরাদ্দ করা মেমোরি স্পেস মুক্ত/খালি করে।
realloc()পূর্বের বরাদ্দ করা মেমোরি স্পেসের পরিবর্তন ঘটায়।

সি  malloc() ফাংশন

malloc এর পূর্ণরূপ "memory allocation"।

malloc() ফাংশন মেমোরির একটি নির্দিষ্ট জাইগা(bolck) দখল করে এবং void টাইপের pointer রিটার্ন করে যার মাধ্যমে যেকোনো আকৃতির(from) পয়েন্টার নিক্ষেপ(cast) হতে পারে।

 

malloc() এর সিনট্যাক্স

 

ptr = (cast-type*) malloc(byte-size)

এখানে ptr হলো নিক্ষেপ(cast) টাইপের পয়েন্টার। malloc() ফাংশন মেমোরির মধ্যে বাইট এককে নির্দিষ্ট সাইজের একটি পয়েন্টার রিটার্ন করে। মেমোরি স্পেস পর্যাপ্ত না হোলে NULL পয়েন্টার রিটার্ন(return) করে।

 

ptr = (int*) malloc(50 * sizeof(int));

এই স্টেটমেন্টটি int এর সাইজ(২ অথবা ৪ বাইট) এর উপর ভীতিকরে যথাক্রমে ১০০ অথবা ২০০ বাইট মেমোরি বরাদ্দ করতে পারে এবং পয়েন্টার মেমোরির প্রথম বাইটের এড্রেসে রেফার(point) করে।


সি  calloc() ফাংশন

calloc এর পূর্ণরুপ "contiguous allocation"।

 

malloc() এবং calloc() এর মধ্যে শুধুমাত্র পার্থক্য হলো malloc() ফাংশন মেমোরির সিঙ্গেল ব্লক(single block of memory) বরাদ্দ করে পক্ষান্তরে calloc() ফাংশন মেমোরির মাল্টিপল ব্লক(multiple blocks of memory) বরাদ্দ করে এবং প্রত্যেকের সাইজ সেট হয় 0(শূন্য)।

 

calloc() এর সিনট্যাক্স

 

ptr = (cast-type*)calloc(n, element-size);

এই স্টেটমেন্টটি n সংখ্যক এলিমেন্ট বিশিষ্ট array জন্য সন্নিহিত(contiguous) মেমোরি স্পেস বরাদ্দ করবে। 

উদাহরণস্বরূপঃ

ptr = (float*) calloc(50, sizeof(double));

এই স্টেটমেন্টটি ৫০টি এলিমেন্ট বিশিষ্ট array জন্য double(8 bytes) সাইজের সন্নিহিত(contiguous) মেমোরি স্পেস বরাদ্দ করবে।

 

সি  free() ফাংশন

 

calloc() অথবা malloc() ফাংশন কর্তৃক ডাইনামিকভাবে(Dynamically) বরাদ্দ হওয়া মেমোরি নিজে নিজে মুক্ত হতে পারে না। তাই আটককৃত(allocated) মেমোরি খালাস(release) করার জন্য আপনাকে অবশ্যই free() ফাংশন ব্যবহার করতে হবে।

 

free() সিনট্যাক্স

 

free(ptr);

এই স্টেটমেন্টটি পয়েন্টার(ptr) কর্তৃক মেমোরিতে বরাদ্দ হওয়া স্পেসকে খালি করে।

উদাহরনঃ সি malloc() এবং free() ফাংশনের ব্যবহার

ইউজার কর্তৃক ইনপুট নিয়ে n সংখ্যক এলিমেন্টের যোগফল নির্ণয়ের জন্য সি প্রোগ্রাম লিখুন।

এই প্রোগ্রামটি সম্পাদনের জন্য malloc() ফাংশন ব্যবহার করে ডাইনামিকভাবে মেমোরি বরাদ্দ(allocate) করতে হবে।

#include <stdio.h>
#include <stdlib.h>
int main()
{
   int num, i, *ptr, sum = 0;
   printf("Enter number of elements: ");
   scanf("%d", &num);
   ptr = (int*) malloc(num * sizeof(int));  //malloc ব্যবহার করে মেমোরি বরাদ্দ করা
   if(ptr == NULL)                     
   {
       printf("Error! memory not allocated.");
       exit(0);
   }
   printf("Enter elements of array: ");
   for(i = 0; i < num; ++i)
   {
       scanf("%d", ptr + i);
       sum += *(ptr + i);
   }
   printf("Sum = %d", sum);
   free(ptr);
   return 0;
}

উদাহরনঃ সি calloc() এবং free() ফাংশনের ব্যবহার

ইউজার কর্তৃক ইনপুট নিয়ে n সংখ্যক এলিমেন্টের যোগফল নির্ণয়ের জন্য সি প্রোগ্রাম লিখুন।

এই প্রোগ্রামটি সম্পাদনের জন্য calloc() ফাংশন ব্যবহার করে ডাইনামিকভাবে মেমোরি বরাদ্দ(allocate) করতে হবে।

#include <stdio.h>
#include <stdlib.h>
int main()
{
   int num, i, *ptr, sum = 0;
   printf("Enter number of elements: ");
   scanf("%d", &num);
   ptr = (int*) calloc(num, sizeof(int)); //calloc ব্যবহার করে মেমোরি বরাদ্দ করা
   if(ptr == NULL)
   {
       printf("Error! memory not allocated.");
       exit(0);
   }
   printf("Enter elements of array: ");
   for(i = 0; i < num; ++i)
   {
       scanf("%d", ptr + i);
       sum += *(ptr + i);
   }
   printf("Sum = %d", sum);
   free(ptr);
   return 0;
}

 

সি  realloc() ফাংশন

ইতিমধ্যে বরাদ্দকৃত মেমোরির সাইজ যদি প্রয়োজনের তুলনায় কম বা বেশি হয় তাহলে realloc() ফাংশন ব্যবহার করে আপনি পূর্ববর্তী মেমোরির সাইজ পরিবর্তন করতে পারেন।

realloc() এর সিনট্যাক্স

 

ptr = realloc(ptr, newsize);

এখানে ptr হলো নতুন সাইজের বরাদ্দ হওয়া মেমোরি।

 

উদাহরনঃ সি realloc() ফাংশনের ব্যবহার

#include <stdio.h>
#include <stdlib.h>
int main()
{
   int *ptr, i , n1, n2;
   printf("Enter size of array: ");
   scanf("%d", &n1);
   ptr = (int*) malloc(n1 * sizeof(int));
   printf("Address of previously allocated memory: ");
   for(i = 0; i < n1; ++i)
        printf("%u\t",ptr + i);
   printf("\nEnter new size of array: ");
   scanf("%d", &n2);
   ptr = realloc(ptr, n2);
   for(i = 0; i < n2; ++i)
        printf("%u\t", ptr + i);
   return 0;
}
common.content_added_and_updated_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion